package tools;

import interfaces.ICommunication;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import serveur.ClientThread;
import serveur.GestionServeur;

/**
 * Classe qui contient les méthodes utiliséesw pour la communication entre client et serveur
 * 
 * @author Kevin Pozderec, Faycal Abka
 *
 */
public class Communication implements ICommunication{	
	
	/**port sur lequel communique le serveur*/
	public static int portCommunication = 1234;
	/**adresse ip du serveur*/
	public static String adresseIPServeur = "localhost";
	
	
	@Override
	public String communication(InetAddress adresseServeur, int port,String chaine,boolean needReturn) {

		/**Flux sur lequel on ecrit*/
		PrintWriter fluxEcriture;
		
		/**Flux sur lequel on lit*/
		BufferedReader fluxLecture;

		/**Socket que l'on manipule pour la communication*/
		Socket s;
		
		/**Chaine de resultat d'un appel*/
		String result;
		
		try {
			s = new Socket(adresseServeur,port);
						
			/**On instancie le flux de sortie en recuperant le output de la connexion qui est etablie*/
			fluxEcriture = new PrintWriter(
                    new BufferedWriter(
                            new OutputStreamWriter(s.getOutputStream())),
                         true);
			
			System.out.println("Chaîne envoyée : "+ chaine);
			fluxEcriture.println(chaine);
			
			/**On instancie le flux d'entree en recuperant le input de la connexion qui est �tablie*/
			if (needReturn){
				fluxLecture = new BufferedReader(new InputStreamReader(s.getInputStream()));
							
				result = fluxLecture.readLine();
				
				System.out.println("Chaine résultat : " + result);
				
				s.close();
				
				return result;
				
			}
			
			s.close();			
			
		} catch (IOException e) {
			
			System.err.println("Erreur à l'établissement de la communication avec l'adresse "+adresseServeur+" sur le port "+port);
		}		
		
		return null;
		
	}

	@Override
	public void serveurLife(int port) {
		
		boolean closeFlag = true;
		ServerSocket s;
		Socket socketServ ;
		GestionServeur gserver = new GestionServeur();
		
		try {
			
			s = new ServerSocket(port);
			System.out.println("Serveur démarré.");
			System.out.println("En attente de connexion client ... ");
			
			while(closeFlag){
				
				/*Attente d'une connexion sur le socket*/
				socketServ = s.accept();
				
				System.out.println("Connexion établie");
				
				/*Creation d'un thread client*/
				new ClientThread(socketServ,gserver);				
				
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}		
	}
	
	

}
